package main

import "fmt"

// 定义一个接口
type AnimalInterface interface {
	Sleep()  // 定义一个方法
	GetAge() int  // 再定义一个有返回值的方法
}

// 定义一个类
type Animal struct {
	Type string
	Age int
}  // 接下来要实现接口里的方法

// 实现接口的一个方法
func (a Animal) Sleep() {
	fmt.Printf("%s need sleep\n", a.Type)
}

// 实现了接口的另一个方法
func (a Animal) GetAge() int {
	return a.Age
}

// 又定义了一个类，是上面的子类
type Pet struct {
	Animal
	Name string
}

// 重构了一个方法
func (p Pet) sleep() {
	fmt.Printf("%s need sleed\n", p.Name)
}  // 有继承，所以Age方法会继承父类的

func main() {
	var a1 Animal = Animal{"Dog", 5}  // 创建一个实例
	var aif AnimalInterface  // 创建一个接口
	aif = a1  // 因为类里实现了接口的方法，所以可以复制给接口
	aif.Sleep()  // 可以用接口调用
	a1.Sleep()  // 使用结构体调用也是一样的效果，这就是多态

	var p1 Pet = Pet{Animal{"Labrador", 4}, "Seven"}
	aif = p1
	aif.Sleep()
	fmt.Println(aif.GetAge())
}
